<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 实现一个mybind方法 

        // bind的使用
        function fn(a, b) {
            console.log("fn:", this, a, b)
            return "你好"
        }


        // fn.bind({name:123})(1,2);



        // 实现一个mybind函数 ；

        // function mybind(fn, obj) {
        //     obj = obj || window;    // 如果obj传入的是null 或者 undefined 那么  obj就是window
        //     obj = Object(obj); // 如果 obj 是一个简单数据类型 ，那么 通过Object函数把简单数据类型转成包装对象；
        //     obj.arg = fn; // 给传入的对象添加一个fn属性 ，symbol(); 通过对象调用的时候，那么 函数里的this就是这个对象；
        //     return function (...myargs) {
        //         var res = obj.arg(...myargs); // 通过对象来调用 对象里的arg函数（fn函数）
        //         //   console.log("------",res)
        //         // 删除对象里的这个属性
        //         delete obj.arg;
        //         return res;
        //     }
        // }

        // var res = mybind(fn, { name: 123 })(1, 2);
        // console.log(res);


        // var myobj = {
        //     name:"hello"
        // }

        // myobj = Object(1111);
        // console.log(myobj);



        // 把mybind函数 挂载在大Function 的原型上，让所有的函数都可以调用；
        Function.prototype.mybind = function(obj){
            obj = obj || window;    // 如果obj传入的是null 或者 undefined 那么  obj就是window
            obj = Object(obj); // 如果 obj 是一个简单数据类型 ，那么 通过Object函数把简单数据类型转成包装对象；
            obj.arg = this; // 给传入的对象添加一个fn属性 ，symbol(); 通过对象调用的时候，那么 函数里的this就是这个对象；
            return function (...myargs) {
                var res = obj.arg(...myargs); // 通过对象来调用 对象里的arg函数（fn函数）
                //   console.log("------",res)
                // 删除对象里的这个属性
                delete obj.arg;
                return res;
            }
        }

        fn.mybind({name:123})(1,2);  // 调用fn函数  且改变fn函数里的this指向




    </script>
</body>

</html>